Software matematic Radu Tiberiu Trˆımbit as

Σχετικά έγγραφα
Metode iterative pentru probleme neliniare - contractii

Metode de interpolare bazate pe diferenţe divizate

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Seminar 5 Analiza stabilității sistemelor liniare

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Sisteme diferenţiale liniare de ordinul 1

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

Esalonul Redus pe Linii (ERL). Subspatii.

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Matrice. Determinanti. Sisteme liniare

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

Integrala nedefinită (primitive)

Curs 4 Serii de numere reale

Analiză numerică O introducerere bazată pe MATLAB

1 Πίνακες και διανύσματα στο MATLAB

INTRODUCERE ÎN PROGRAMAREA MATLAB

Curs 1 Şiruri de numere reale

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

Sisteme liniare - metode directe

Spatii liniare. Exemple Subspaţiu liniar Acoperire (înfăşurătoare) liniară. Mulţime infinită liniar independentă

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

Asupra unei inegalităţi date la barajul OBMJ 2006

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

MARCAREA REZISTOARELOR

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

III. Reprezentarea informaţiei în sistemele de calcul

5.4. MULTIPLEXOARE A 0 A 1 A 2

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

Subiecte Clasa a VIII-a

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)

Criptosisteme cu cheie publică III

1.3 Baza a unui spaţiu vectorial. Dimensiune

Subiecte Clasa a VII-a

2 Transformări liniare între spaţii finit dimensionale

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Laborator 11. Mulţimi Julia. Temă

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

Subiecte Clasa a V-a


Seminar Algebra. det(a λi 3 ) = 0

riptografie şi Securitate

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

2. Circuite logice 2.2. Diagrame Karnaugh. Copyright Paul GASNER 1

Limbaje de Programare Curs 3 Iteraţia. Reprezentare internă. Operatori pe biţi

LUCRAREA 1 INTRODUCERE ÎN MATLAB

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Vectori liberi Produs scalar Produs vectorial Produsul mixt. 1 Vectori liberi. 2 Produs scalar. 3 Produs vectorial. 4 Produsul mixt.

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

Laborator 6. Integrarea ecuaţiilor diferenţiale

2. Circuite logice 2.5. Sumatoare şi multiplicatoare. Copyright Paul GASNER

8 Intervale de încredere

Concurs MATE-INFO UBB, 1 aprilie 2017 Proba scrisă la MATEMATICĂ

Curs 2 Şiruri de numere reale

Toate subiectele sunt obligatorii. Timpul de lucru efectiv este de 3 ore. Se acordă din oficiu 10 puncte. SUBIECTUL I.


Să se arate că n este număr par. Dan Nedeianu

28. SUPRADEFINIREA OPERATORILOR

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

Geometrie computationala 2. Preliminarii geometrice

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

a. 11 % b. 12 % c. 13 % d. 14 %

CONCURSUL DE MATEMATICĂ APLICATĂ ADOLF HAIMOVICI, 2017 ETAPA LOCALĂ, HUNEDOARA Clasa a IX-a profil științe ale naturii, tehnologic, servicii

1.4 Schimbarea bazei unui spaţiu vectorial

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

CURS 11: ALGEBRĂ Spaţii liniare euclidiene. Produs scalar real. Spaţiu euclidian. Produs scalar complex. Spaţiu unitar. Noţiunea de normă.

Progresii aritmetice si geometrice. Progresia aritmetica.

z a + c 0 + c 1 (z a)

Functii Breviar teoretic 8 ianuarie ianuarie 2011

Principiul Inductiei Matematice.

V O. = v I v stabilizator

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Concurs MATE-INFO UBB, 25 martie 2018 Proba scrisă la MATEMATICĂ

Problema a II - a (10 puncte) Diferite circuite electrice

Ecuatii trigonometrice

Proiectarea Algoritmilor 2. Scheme de algoritmi Divide & Impera

Activitatea A5. Introducerea unor module specifice de pregătire a studenţilor în vederea asigurării de şanse egale

Examen AG. Student:... Grupa:... ianuarie 2011

Programarea Calculatoarelor

CURS XI XII SINTEZĂ. 1 Algebra vectorială a vectorilor liberi

Arhitectura Calculatoarelor. Fizică - Informatică an II. 2. Circuite logice. Copyright Paul GASNER 1

Instructiunea while. Forma generala: while (expresie) instructiune;

Examen AG. Student:... Grupa: ianuarie 2016

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

9 Testarea ipotezelor statistice

Cursul Măsuri reale. D.Rusu, Teoria măsurii şi integrala Lebesgue 15

Transcript:

Software matematic Radu Tiberiu Trîmbiţaş

ii

Prefaţă Pentru a descărca sursele din această carte şi soluţiile problemelor trimitem cititorul la pagina de web a autorului: http://www.math.ubbcluj.ro/ tradu. Radu Tiberiu Trîmbiţaş iii

iv Prefaţă

Cuprins 1. Introducere în MATLAB 1 1.1. Lansarea MATLAB şi sistemul de help................ 2 1.2. Modul calculator........................... 3 1.3. Matrice................................ 6 1.3.1. Generarea matricelor..................... 6 1.3.2. Indexarea şi notaţia,,:.................... 11 1.3.3. Operaţii în sens matricial şi în sens tablou.......... 14 1.3.4. Analiza datelor........................ 17 1.3.5. Operatori relaţionali şi logici................. 2 1.4. Programarea în MATLAB...................... 24 1.4.1. Fluxul de control....................... 24 1.4.2. Fişiere M........................... 28 1.4.3. Argumente funcţie...................... 33 1.4.4. Număr variabil de argumente................. 36 1.4.5. Variabile globale....................... 38 1.4.6. Recursivitate......................... 39 1.4.7. Alte tipuri numerice..................... 42 1.4.8. Controlul erorilor....................... 44 1.5. Toolbox-urile Symbolic........................ 46 Probleme............................... 53 2. Grafică în MATLAB 55 2.1. Grafice bidimensionale........................ 56 2.1.1. Grafice de bază........................ 56 v

vi Cuprins 2.1.2. Axe şi adnotarea....................... 62 2.1.3. Mai multe grafice pe aceeaşi figură............. 65 2.2. Grafice tridimensionale........................ 67 2.3. Salvarea şi imprimarea graficelor................... 75 2.4. Facilităţi grafice noi în MATLAB 7.................. 77 Probleme............................... 77 3. Algebră liniară în MATLAB 79 3.1. Rezolvarea sistemelor de ecuaţii liniare în MATLAB........ 79 3.1.1. Sisteme pătratice....................... 8 3.1.2. Sisteme supradeterminate.................. 8 3.1.3. Sisteme subdeterminate................... 81 3.1.4. Factorizarea LU şi Cholesky................. 82 3.1.5. Factorizarea QR....................... 83 3.2. Polinoame şi potrivirea datelor în MATLAB............. 87 3.3. Valori şi vectori proprii în MATLAB................. 94 Probleme............................... 99 4. Interpolare în MATLAB 17 4.1. Interpolare unidimensională..................... 17 4.2. Interpolarea funcţiilor de mai multe variabile în MATLAB..... 111 Probleme............................... 114 5. Funcţii de funcţii 119 5.1. Integrare numerică în MATLAB................... 119 5.2. Calculul integralelor duble în MATLAB............... 122 5.3. Ecuaţii neliniare şi minimizare.................... 123 Probleme............................... 126 6. Ecuaţii diferenţiale în MATLAB 131 6.1. Rezolvitori.............................. 131 6.2. Exemple non-stiff........................... 133 6.3. Opţiuni................................ 135 6.4. Ecuaţii stiff.............................. 138 6.5. Tratarea evenimentelor........................ 145 6.6. Ecuaţii implicite............................ 154 Probleme............................... 155 Bibliografie 165 Indice 167

Lista surselor MATLAB 1.1 Funcţia stat............................. 3 1.2 Funcţia sqrtn............................ 32 1.3 Funcţia fd deriv.......................... 35 1.4 Funcţia companb.......................... 37 1.5 Funcţia momente.......................... 38 1.6 Funcţia koch............................. 4 1.7 Fulgul lui Koch............................ 41 2.1 Reprezentarea grafică a unei funcţii implicite............ 7 3.1 Exemplu de aproximare în sensul celor mai mici pătrate....... 95 6.1 Sistemul lui Rössler.......................... 137 6.2 Problemă stiff cu informaţii despre jacobian............. 146 6.3 Problema celor două corpuri..................... 149 6.4 Funcţiile fox2 şi events pentru problema de urmărire...... 153 vii

viii LISTA SURSELOR MATLAB

CAPITOLUL 1 Introducere în MATLAB Cuprins 1.1. Lansarea MATLAB şi sistemul de help.............. 2 1.2. Modul calculator......................... 3 1.3. Matrice.............................. 6 1.3.1. Generarea matricelor................... 6 1.3.2. Indexarea şi notaţia,,:.................. 11 1.3.3. Operaţii în sens matricial şi în sens tablou........ 14 1.3.4. Analiza datelor...................... 17 1.3.5. Operatori relaţionali şi logici............... 2 1.4. Programarea în MATLAB.................... 24 1.4.1. Fluxul de control..................... 24 1.4.2. Fişiere M......................... 28 1.4.3. Argumente funcţie.................... 33 1.4.4. Număr variabil de argumente............... 36 1.4.5. Variabile globale..................... 38 1.4.6. Recursivitate....................... 39 1.4.7. Alte tipuri numerice................... 42 1.4.8. Controlul erorilor..................... 44 1.5. Toolbox-urile Symbolic...................... 46 Probleme............................. 53 1

2 Introducere în MATLAB MATLAB 1 este un sistem interactiv destinat calculelor numerice. Prima versiune MATLAB a fost scrisă în anii 7 de Cleve Moler. MATLAB uşurează sarcina utilizatorului de a rezolva problemele numerice. Aceasta permite concentrarea asupra părţii creatoare a rezolvării problemei şi încurajează experimentele. MATLAB utilizează algoritmi cunoscuţi şi testaţi, în care utilizatorul poate avea încredere. Operaţiile puternice se pot realiza uşor cu un număr mic de comenzi (de multe ori una sau două). Vă puteţi programa propriul set de funcţii pentru aplicaţia dumneavoastră. De asemenea, sunt disponibile facilităţi grafice excelente, iar imaginile pot fi inserate în documente LATEX sau Word. Pentru o introducere mai detaliată în MATLAB a se vedea [5, 15, 1]. 1.1. Lansarea MATLAB şi sistemul de help Sub sistemul de operare Windows, MATLAB se lansează dând un click dublu pe icon-ul corespunzător sau selectând programul din meniul de start. Prompterul din fereastra de comandă este indicat prin >>. MATLAB poate fi utilizat în mai multe moduri: ca un calculator avansat (când comenzile sunt introduse în linia de comandă de la tastatură), ca un limbaj de programare de nivel înalt şi sub formă de rutine apelate dintr-un limbaj de programare, de exemplu C. Informaţiile de help pot fi obţinute în mai multe moduri: din linia de comandă utilizând comanda help subiect ; dintr-o fereastră de help separată, deschisă prin meniul Help; utilizând MATLAB helpdesk memorat pe disc sau CD. Comanda help help da o scurtă descriere a sistemului de help, iar help fară nici un parametru dă o listă a subiectelor de help. Primele linii arată astfel HELP topics: matlab\general - General purpose commands. matlab\ops - Operators and special characters. matlab\lang - Programming language constructs. matlab\elmat - Elementary matrices and matrix manipulation. matlab\elfun - Elementary math functions. matlab\specfun - Specialized math functions. matlab\matfun - Matrix functions - numerical linear algebra. Pentru a obţine informaţii de help despre funcţiile elementare se tastează 1 MATLAB R este o marcă înregistrată a Mathworks Inc., Natick MA

1.2. Modul calculator 3 >> help elfun Pentru a obţine doar un ecran la un moment dat se poate introduce întâi comanda more on, adică >> more on >> help elfun Pentru a trece la următoarea pagină se poate apăsa orice tastă. O altă facilitate utilă este utilizarea unei comenzi de forma lookfor cuvant-cheie, care caută în fişierele help un cuvânt cheie. Propunem cititorului să testeze lookfor factorization, care dă informaţii despre rutinele de factorizare a matricelor, deosebit de utile în algebra liniară. Pentru începători şi cei care predau MATLAB demonstraţiile sunt foarte utile. Un set cuprinzător se poate lansa prin comanda >> demo Atenţie, ea şterge toate variabilele! Înafară de facilitatea de help on-line, există un sistem bazat pe hipertext, care dă detalii asupra asupra celor mai multe comenzi şi exemple. El este disponibil prin comanda doc. 1.2. Modul calculator Operaţiile aritmetice de bază sunt + - * / şi ridicarea la putere ˆ. Ordinea implicită a operaţiilor se poate schimba cu ajutorul parantezelor. MATLAB recunoşte mai multe tipuri de numere: întregi, cum are fi 1362 sau -217897; reale, de exemplu 1.234, 1.76; complexe, cum ar fi3.21 4.3i, unde i = 1; Inf, desemnează infinitul; NaN, Not a Number, care se obţine ca rezultat al unei operaţii ilegale sau al unei nedeterminări din analiza matematică (/, /,, etc.). Notaţia cu exponent este de asemenea utilizată: 1.3412e+3 = 1.3412 1 3 = 1341.2 1.3412e 1 = 1.3412 1 1 =.13412

4 Introducere în MATLAB Toate calculele se realizează în virgulă flotantă. Formatul în care MATLAB afişează numerele este controlat de comanda format. Tastaţi help format pentru o listă completă. Tabela următoare dă câteva exemple. Comanda format short format short e format long e format short g format bank Exemple de ieşiri 31.4162(4 zecimale) 31.416e+1 3.141592653589793e+ 31.4162(4 zecimale) 31.42(2 zecimale) Comanda format compact elimină liniile goale de la ieşire şi permite să se afişeze mai multă informaţie. Numele de variabile în MATLAB sunt formate din secvenţe de litere şi cifre, prima fiind o literă. Exemple: x, y, z525, TotalGeneral. Se face distincţie între literele mari şi cele mici. Există şi nume speciale, a căror folosire trebuie evitată, cum ar fi: - eps = 2.224e-16 = 2 54 este epsilon-ul maşinii care reprezintă cel mai mare număr cu proprietatea că 1+eps nu poate fi distins de 1; - pi = π. Dacă se fac calcule cu numere complexe folosirea variabilelor i şi j este contraindicată, deoarece ele desemnează unitatea imaginară. Dăm câteva exemple: >>x = 3-2ˆ4 x = -13 >>y = x*5 y = -65 >>eps 2.224e-16 Variabila specială ans păstrează valoarea ultimei expresii evaluate. Ea poate fi utilizată în expresii, la fel ca orice altă variabilă. >>3-2ˆ4-13 >>ans*5-65

1.2. Modul calculator 5 cos, sin, tan, csc, sec, cot acos, asin, atan, atan2, asec, acsc, acot cosh, sinh, tanh, sech, csch, coth acosh, asinh, atanh, asech, acsch, acoth log, log2, log1, exp, pow2, nextpow2 ceil, fix, floor, round abs, angle, conj, imag, real mod, rem, sign airy, bessel*, beta*, erf*, expint, gamma*, legendre factor, gcd, isprime, lcm, primes, nchoosek, perms, rat, rats cart2sph, cart2pol, pol2cart, sph2cart Funcţii trigonometrice Funcţii trigonometrice inverse Funcţii hiperbolice Funcţii hiperbolice inverse Funcţii exponenţiale Rotunjiri Complexe Rest, semn Funcţii matematice Funcţii din teoria numerelor Transformări de coordonate Tabela 1.1: Funcţii elementare şi funcţii matematice speciale ("fun*" indică existenţa mai multor funcţii al căror nume începe cu fun Dacă dorim să suprimăm afişarea ultimei expresii evaluate, vom pune caracterul,,; la sfârşitul expresiei. Pe o linie de comandă se pot introduce mai multe expresii. Ele pot fi separate prin virgulă, caz în care valoarea expresiei terminată cu virgulă va fi afişată, sau cu,,;, caz în care valoarea expresiei nu va fi afişată. >> x=-13; y = 5*x, z = xˆ2+y, z2 = xˆ2-y; y = -65 z = 14 Dacă dorim să salvăm variabile, o putem face cu comanda >>save nume-fisier lista-variabile unde variabilele din lista-variabile sunt separate prin blanc. Se pot folosi în numele de variabile construcţii de tip wildcard, desemnate prin *. Rezultatul salvării se păstrează în fişierul nume-fisier de tip.mat, în format binar, specific MA- TLAB. Variabilele salvate pot fi încărcate prin >>load nume-fisier

6 Introducere în MATLAB Se pot face salvări şi încărcări şi în format ascii, în dublă precizie sau prin adăugare la un fişier existent. Pentru detalii a se vedea help save şi help load. Lista variabilelor utilizate în sesiunea curentă se poate vizualiza cu whos: >>whos Name Size Bytes Class ans 1x1 8 double array i 1x1 8 double array v 1x3 24 double array x 1x1 8 double array y 1x1 8 double array z 1x1 8 double array z2 1x1 8 double array Grand total is 7 elements using 72 bytes Comanda >>diary nume-fisier salvează toate comenzile şi rezultatele afişate pe ecran (cu excepţia celor ale comenzilor grafice) în fişierul nume-fisier. Acest proces de,,jurnalizare se termină prin >>diary off MATLAB dispune de un set bogat de funcţii elementare, care apar organizate pe clase în tabela 1.1. 1.3. Matrice Matricele sunt tipuri de date fundamentale în MATLAB. Ele sunt de fapt tablouri multidimensionale în dublă precizie. Cele mai folosite sunt matricele bidimensionale, care sunt tablouri bidimensionale cu m linii şi n coloane. Vectorii linie (m = 1) şi coloană (n = 1) sunt cazuri particulare de matrice bidimensionale. 1.3.1. Generarea matricelor Există mai multe moduri de a genera matrice. Unul dintre ele este cel explicit, care utilizează parantezele pătrate. Ca separatori între elemente se folosesc blancul sau virgula în interiorul unei linii şi punctul şi virgula sau,,newline pentru a separa liniile: >> A = [5 7 9 1-3 -7] A = 5 7 9 1-3 -7

1.3. Matrice 7 zeros Matricea nulă ones Matrice formată din elemente 1 eye Matricea identică repmat Replicarea şi pavarea tablourilor rand Numere aleatoare distribuite uniform randn Numere aleatoare distribuite normal linspace Vector de elemente echidistante logspace Vector de elemente spaţiate logaritmic Tabela 1.2: Funcţii pentru generarea de matrice >> B = [-1 2 5; 9 5] B = -1 2 5 9 5 >> C = [, 1; 3, -2; 4, 2] C = 1 3-2 4 2 Dimensiunea unei matrice se poate obţine cu comanda size: >> v = size(a) v = 2 3 >> [r, c] = size(a) r = 2 c = 3 Prima formă returnează un vector cu două elemente ce conţine numărul de linii şi respectiv de coloane. A doua pune dimensiunile în variabile separate. MATLAB are un set util de funcţii pentru construirea unor matrice speciale, vezi tabela 1.2. Matricele de zerouri, de elemente 1 şi matricele identice se obţin cu funcţiile zeros, ones şi respectiv eye. Toate au aceeaşi sintaxă. De exemplu, zeros(m,n) sau zeros([m,n]) produce o matrice m n de zerouri, în timp ce zeros(n) produce o matrice n n. Exemple: >> zeros(2)

8 Introducere în MATLAB >> ones(2,3) 1 1 1 1 1 1 >> eye(3,2) 1 1 O situaţie comună se întâlneşte atunci când se doreşte construirea unei matrice identice sau nule având o dimensiune egală cu a unei matrice date A. Aceasta se poate face cu eye(size(a)). O funcţie înrudită cu size este funcţia length: length(a) este cea mai mare dintre dimensiunile lui A. Astfel, pentru un vector n 1 sau 1 n, x, length(x) returnează n. Funcţiile rand şi randn generează matrice de numere (pseudo-)aleatoare, utilizând aceeaşi sintaxă ca şi eye. Funcţia rand produce o matrice de numere aleatoare având distribuţia uniformă pe intervalul [,1]. Funcţia randn generează o matrice de numere aleatoare având distribuţia normală standard. Apelate fără argumente, ambele funcţii produc un singur număr aleator. >> rand.457 >> rand(3).9355.8936.8132.9169.579.99.413.3529.1389 În simulările şi experimentele cu numere aleatoare este important ca secvenţele de numere aleatoare să fie reproductibile. Numerele produse de rand depind de starea generatorului. Starea se poate seta prin comanda rand( state,j). Pentru j= generatorul rand este setat în starea iniţială (starea de la lansarea MATLAB). Pentru întregi j nenuli, generatorul este setat pe a j-a stare. Starea lui randn se setează în acelaşi mod. Perioadele lui rand şi randn, adică numărul de termeni generaţi înainte ca secvenţele să înceapă să se repete este mai mare decât 2 1492 1 449. Matricele se pot construi şi în formă de bloc. Din matricea B, definită prin B=[1 2; 3 4], putem crea >> C=[B, zeros(2); ones(2), eye(2)] C = 1 2 3 4 1 1 1

1.3. Matrice 9 1 1 1 Matricele diagonale pe blocuri se pot defini utilizând funcţia blkdiag, care este mai uşor de utilizat decât notaţia cu paranteze pătrate. Exemplu: >> A=blkdiag(2*eye(2),ones(2)) A = 2 2 1 1 1 1 Funcţia repmat permite construirea de matrice prin repetarea de subblocuri: repmat(a,m,n) crează o matrice de m pe n blocuri în care fiecare bloc este o copie a lui A. Dacă n lipseşte, valoarea sa implicită este m. Exemplu: >> A=repmat(eye(2),2) A = 1 1 1 1 1 1 1 1 Sunt disponibile şi comenzi pentru manipularea matricelor; vezi tabela 1.3. reshape diag blkdiag tril triu fliplr flipud rot9 Schimbarea dimensiunii Matrice diagonale şi diagonale ale matricelor Matrice diagonală pe blocuri Extragerea părţii triunghiulare inferior Extragerea părţii triunghiulare inferior Rotire matrice în jurul axei de simetrie verticale Rotire matrice în jurul axei de simetrie orizontale Rotaţia unei matrice cu 9 de grade Tabela 1.3: Funcţii de manipulare a matricelor Funcţia reshape schimbă dimensiunile unei matrice: reshape(a,m,n) produce o matrice m pe n ale cărei elemente sunt luate coloană cu coloană din A. De exemplu: >>A=[1 4 9; 16 25 36], B=reshape(A,3,2) A = 1 4 9 16 25 36 B = 1 25

1 Introducere în MATLAB 16 9 4 36 Funcţia diag lucrează cu diagonalele unei matrice şi poate avea ca argument o matrice sau un vector. Pentru un vector x, diag(x) este matricea cu diagonala principală x: >>diag([1,2,3]) 1 2 3 Mai general, diag(x,k) pune x pe diagonala cu numărul k, unde k = înseamnă diagonala principală, k > specifică diagonale situate deasupra diagonalei principale, iar k < diagonale dedesubtul diagonalei principale: >> diag([1,2],1) 1 2 >> diag([3 4],-2) 3 4 Pentru o matrice A, diag(a) este vectorul coloană format din elementele de pe diagonala principală a lui A. Pentru a produce o matrice diagonală având aceaşi diagonală ca A se va utiliza diag(diag(a)). Analog cazului vectorial, diag(a,k) produce un vector coloană construit din a k-a diagonală a lui A. Astfel dacă A = atunci 2 3 5 7 11 13 17 19 23 >> diag(a) 2 11 23 >> diag(a,-1)

1.3. Matrice 11 7 19 tril(a) obţine partea triunghiulară inferior a lui A (elementele situate pe diagonală principală şi dedesubtul ei şi în rest zero). Analog lucrează triu(a) pentru partea triunghiulară superior. Mai general, tril(a,k) dă elementele situate pe diagonala a k-a a lui A şi dedesubtul ei, în timp ce triu(a,k) dă elementele situate pe a k-a diagonală a lui A şi deasupra ei. Pentru A ca mai sus: >>tril(a) 2 7 11 17 19 23 >>triu(a,1) 3 5 13 >>triu(a,-1) 2 3 5 7 11 13 19 23 MATLAB posedă un set de funcţii pentru generarea unor matrice speciale. Aceste matrice au proprietăţi interesante care le fac utile pentru construirea de exemple şi testarea algoritmilor. Ele sunt date în tabela 1.4. Funcţia gallery asigură accesul la o colecţie bogată de matrice de test creată de Nicholas J. Higham [6]. Pentru detalii vezi help gallery. 1.3.2. Indexarea şi notaţia,,: Pentru a permite accesul şi atribuirea la nivel de submatrice, MATLAB are o notaţie puternică bazată pe caracterul,,:. Ea este utilizată pentru a defini vectori care acţionează ca indici. Pentru scalarii i şi j, i:j desemnează vectorul linie cu elementele i, i+1,... j (pasul este 1). Un pas diferit, s, se specifică prin i:s:j. Exemple: >> 1:5 1 2 3 4 5 >> 4:-1:-2

12 Introducere în MATLAB compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson matrice companion colecţie de matrice de test matrice Hadamard matrice Hankel matrice Hilbert inversa matricei Hilbert pătrat magic matricea Pascal (coeficienţi binomiali) matrice simetrică pentru testarea valorilor proprii matrice Toeplitz matrice Vandermonde matricea lui Wilkinson pentru testarea valorilor proprii Tabela 1.4: Matrice speciale 4 3 2 1-1 -2 >> :.75:3.75 1.5 2.25 3. Elementele individuale ale unei matrice se accesează prin A(i,j), unde i 1 şi j 1 (indicii zero sau negativi nu sunt admişi în MATLAB). Notaţia A(p:q,r:s) desemnează submatricea constând din intersecţia liniilor de la p la q şi coloanelor de la r la s a lui A. Ca un caz special, caracterul,,: singur, ca specificator de linie şi coloană, desemnează toate elementele din acea linie sau coloană: A(:,j) este a j-a coloană a lui A, iar A(i,:) este a i-a linie. Cuvântul cheie end utilizat în acest context desemnează ultimul indice în dimensiunea specificată; astfel A(end,:) selectează ultima linie a lui A. În fine, o submatrice arbitrară poate fi selectată specificând indicii de linie şi coloană individuali. De exemplu, A([i,j,k],[p,q]) produce submatricea dată de intersecţia liniilor i, j şi k şi coloanelor p şi q. Iată câteva exemple ce utilizează matricea >> A = [ 2 3 5 7 11 13 17 19 23 ] a primelor nouă numere prime: >> A(2,1) 7 >> A(2:3,2:3)

1.3. Matrice 13 11 13 19 23 >> A(:,1) 2 7 17 >> A(2,:) 7 11 13 >> A([1 3],[2 3]) 3 5 19 23 Un caz mai special este A(:)care desemnează un vector coloană ce conţine toate elementele lui A, aşezate coloană după coloană, de la prima la ultima >> B=A(:) B = 2 7 17 3 11 19 5 13 23 Când apare în partea stângă a unei atriburi, A(:) completează A, păstrându-i forma. Cu astfel de notaţie, matricea de numere prime3 3, A, se poate defini prin >> A=zeros(3); A(:)=primes(23); A=A A = 2 3 5 7 11 13 17 19 23 Funcţia primes returnează un vector de numere prime mai mici sau egale cu argumentul ei. Transpunerea A = A (vezi secţiunea 1.3.3) este necesară pentru a ordona numerele prime după linii nu după coloane. Legată de notaţia,,: este funcţia linspace, care în loc de increment acceptă număr de puncte: linspace(a,b,n) generează n puncte echidistante între a şi b. Dacă n lipseşte, valoarea sa implicită este 1. Exemplu:

14 Introducere în MATLAB >> linspace(-1,1,9) Columns 1 through 7-1. -.75 -.5 -.25.25.5 Columns 8 through 9.75 1. Notaţia [] înseamnă matricea vidă,. Atribuirea lui [] unei linii sau unei matrice este un mod de a şterge o linie sau o coloană a matricei: >>A(2,:)=[] A = 2 3 5 17 19 23 Acelaşi efect se obţine cu A = A([1,3],:). Matricea vidă este de asemenea utilă ca indicator de poziţie într-o listă de argumente, aşa cum se va vedea în 1.3.4. Operaţia Sens matricial Sens tablou Adunare + + Scădere - - Înmulţire *.* Împărţire stângă \.\ Împărţire uzuală /./ Ridicare la putere ˆ.ˆ Tabela 1.5: Operaţii pe matrice şi tablouri 1.3.3. Operaţii în sens matricial şi în sens tablou Pentru scalarii a şi b, operaţiile +, -, / and ˆ produc rezultate evidente. Pe lângă operatorul uzual de împărţire, cu semnificaţia a b, MATLAB are operatorul de împărţire stângă (backslash\), cu semnificaţia b a. Pentru matrice, toate aceste operaţii pot fi realizate în sens matricial (în conformitate cu regulile algebrei matriciale) sau în sens tablou (element cu element). Tabela 1.5 dă lista lor. Operaţiile de adunare şi scădere sunt identice atât în sens matricial cât şi în sens tablou. Produsul A*B este înmulţirea matricială uzuală. Operatorii de împărţire / şi \ definesc soluţii ale sistemelor liniare: A\B este soluţia X a lui A*X = B, în timp ce A/B este soluţia lui X*B = A. Exemple: >> A=[2,3,5; 7,11,13; 17,19,23] A = 2 3 5

1.3. Matrice 15 7 11 13 17 19 23 >> A=[1 2; 3 4], B=ones(2) A = 1 2 3 4 B = 1 1 1 1 >> A+B 2 3 4 5 >> A*B 3 3 7 7 >> A\B -1-1 1 1 Înmulţirea şi împărţirea în sens tablou, sau pe elemente, se specifică precedând operatorul cu un punct. Dacă A şi B sunt matrice de aceeaşi dimensiune, atunci C = A.*B însemnă C(i,j)=A(i,j)*B(i,j) iar C = A.\B înseamnă C(i,j)=B(i,j)/A(i,j). Pentru A şi B ca în exemplul precedent: >> A.*B 1 2 3 4 >> B./A 1..5.3333.25 Inversa unei matrice pătratice nesingulare se obţine cu funcţia inv, iar determinantul unei matrice pătratice cu det. Ridicarea la putere ˆ este definită ca putere a unei matrice, dar forma cu punct face ridicarea la putere element cu element. Astfel, dacă A este o matrice pătratică, atunci Aˆ2 este A*A, dar A.ˆ2 se obţine ridicând la pătrat fiecare element al lui A: >> Aˆ2, A.ˆ2 7 1 15 22

16 Introducere în MATLAB 1 4 9 16 Operaţia.ˆ permite ca exponentul să fie un tablou când dimensiunile bazei şi exponentului coincid, sau când baza este un scalar: >> x=[1 2 3]; y=[2 3 4]; Z=[1 2; 3 4]; >> x.ˆy 1 8 81 >> 2.ˆx 2 4 8 >> 2.ˆZ 2 4 8 16 Ridicarea la putere a matricelor este definită pentru toate puterile, nu numai pentru întregi pozitivi. Dacă n< este un întreg, atunci Aˆn este definit prin inv(a)ˆ(-n). Pentru p neîntreg, Aˆp este evaluată utilizând valorile proprii ale lui A; rezultatul poate fi incorect sau imprecis dacă A nu este diagonalizabilă sau când A este prost condiţionată din punct de vedere al valorilor proprii. Transpusa conjugată a matricei A se obţine cu A. Dacă A este reală, atunci aceasta este transpusa obişnuită. Transpusa fără conjugare se obţine cu A.. Alternativele funcţionale ctranspose(a) şi transpose(a) sunt uneori mai convenabile. În cazul particular al vectorilor coloană x şi y, x *y este produsul scalar, care se poate obţine şi cu dot(x,y). Produsul vectorial a doi vectori se poate obţine cu cross. Exemplu: >> x=[-1 1] ; y=[3 4 5] ; >> x *y 2 >> dot(x,y) 2 >> cross(x,y) -4 8-4

1.3. Matrice 17 La adunarea dintre un scalar şi o matrice, MATLAB va expanda scalarul într-o matrice cu toate elementele egale cu acel scalar. De exemplu >> [4,3;2,1]+4 8 7 6 5 >> A=[1-1]-6 A = -5-7 Totuşi, dacă atribuirea are sens fără expandare, atunci va fi interpretată în acest mod. Astfel, dacă comanda precedentă este urmată de A=1, A va deveni scalarul 1, nu ones(1,2). Dacă o matrice este înmulţită sau împărţită cu un scalar, operaţia se realizează element cu element: >> [3 4 5; 4 5 6]/12.25.3333.4167.3333.4167.5 Funcţiile de matrice în sensul algebrei liniare au numele terminat în m: expm, funm, logm, sqrtm. De exemplu, pentru A = [2 2; 2], >> sqrt(a) 1.4142 1.4142 1.4142 >> sqrtm(a) 1.4142.771 1.4142 >> ans*ans 2. 2. 2. 1.3.4. Analiza datelor Tabela 1.6 dă funcţiile de bază pentru analiza datelor. Cel mai simplu mod de utilizare a lor este să fie aplicate unui vector, ca în exemplele >> x=[4-8 -2 1 ] x = 4-8 -2 1 >> [min(x) max(x)]

18 Introducere în MATLAB max min mean median std var sort sum prod cumsum cumprod diff Maximul Minimul Media Mediana Abaterea medie pătratică Dispersia Sortare în ordine crescătoare Suma elementelor Produsul elementelor Suma cumulată Produsul cumulat Diferenţa elementelor Tabela 1.6: Funcţii de bază pentru analiza datelor -8 4 >>sort(x) -8-2 1 4 >>sum(x) -5 Funcţia sort sortează crescător. Pentru un vector real x, se poate face sortarea descrescătoare cu -sort(-x). Pentru vectori complecşi, sort sortează după valorile absolute. Dacă argumentele sunt matrice, aceste funcţii acţionează pe coloane. Astfel, max şi min returnează un vector ce conţine elementul maxim şi respectiv cel minim al fiecărei coloane, sum returnează un vector ce conţine sumele coloanelor, iar sort sortează elementele din fiecare coloană a unei matrice în ordine crescătoare. Funcţiile min şi max pot returna un al doilea argument care specifică în care componente sunt situate elementul minim şi cel maxim. De exemplu, dacă A = atunci -1 2 1 2-4 5-3 -4 >>max(a) 5 2 2

1.3. Matrice 19 >>[m,i]=min(a) m = -3-4 i = 1 3 2 Aşa cum ne arată acest exemplu, dacă există două sau mai multe elemente minimale într-o coloană, se returnează numai indicele primului. Cel mai mic element dintr-o matrice se poate obţine aplicând min de două ori succesiv: >>min(min(a)) -4 sau utilizând >> min(a(:)) -4 Funcţiile max şi min pot fi făcute să acţioneze pe linie printr-un al treilea argument: >>max (A,[],2) 2 2 5 Argumentul 2 din max(a,[],2) specifică maximul după a doua dimensiune, adică după indicele de coloană. Al doilea argument vid [] este necesar, deoarece max sau min cu două argumente returnează maximul sau minimul celor două argumente: >>max(a,) 2 1 2 5 Funcţiile sort şi sum pot fi şi ele făcute să acţioneze pe linii, printr-un al doilea argument. Pentru detalii a se vedea help sort sau doc sort. Funcţia diff calculează diferenţe. Aplicată unui vector x de lungime n produce vectorul [x(2)-x(1) x(3)-x(2)... x(n)-x(n-1)] de lungime n-1. Exemplu >>x=(1:8).ˆ2 x = 1 4 9 16 25 36 49 64 >>y=diff(x)

2 Introducere în MATLAB y = 3 5 7 9 11 13 15 >>z=diff(y) z = 2 2 2 2 2 2 1.3.5. Operatori relaţionali şi logici Operatorii relaţionali în MATLAB sunt: == (egal), =(diferit), < (mai mic), > (mai mare), <= (mai mic sau egal) şi >= (mai mare sau egal). De notat că un singur egal = înseamnă atribuire. Comparaţia între scalari produce 1 dacă relaţia este adevărată şi în caz contrar. Comparaţiile sunt definite între matrice de aceeaşi dimensiune şi între o matrice şi un scalar, rezultatul fiind în ambele cazuri o matrice de şi 1. La comparaţia matricematrice se compară perechile corespunzătoare de elemente, pe când la comparaţia matrice-scalar se compară scalarul cu fiecare element. De exemplu: >> A=[1 2; 3 4]; B = 2*ones(2); >> A == B 1 >>A > 2 1 1 Pentru a testa dacă dacă matricele A şi B sunt identice, se poate utiliza expresia isequal(a,b): >> isequal(a,b) Mai există şi alte funcţii logice înrudite cu isequal şi al căror nume începe cu is. O selecţie a lor apare în tabela 1.7; pentru o listă completă a se tasta doc is. Funcţia isnan este utilă deoarece testul x == NaN produce întotdeauna (false), chiar dacă x este NaN! (Un NaN este prin definiţie diferit de orice şi nu are o relaţie de ordine cu nimic.) Operatorii logici în MATLAB sunt: & (şi), (sau), (not), xor (sau exclusiv), all (adevărat dacă toate elementele unui vector sunt nenule), any (adevărat dacă cel puţin un element al unui vector este nenul). Dăm câteva exemple: >> x = [-1 1 1]; y = [1 2-3]; >> x> & y>

1.3. Matrice 21 ischar isempty isequal isfinite isieee isinf islogical isnan isnumeric isreal issparse Testează dacă argumentul este şir de caractere(string) Testează dacă argumentul este vid Testează dacă tablourile sunt identice Testează dacă elementele unui tablou sunt finite Testeză dacă maşina utilizează aritmetica IEEE Testează dacă elementele unui tablou sunt inf Testează dacă argumentul este un tablou logic Test de NaN Testează dacă argumentul este numeric Testează dacă argumentul este tablou real Testează dacă argumentul este tablou rar Tabela 1.7: O selecţie de funcţii logice is* 1 >> x> y> 1 1 1 >> xor(x>,y>) 1 1 >> any(x>) 1 >>all(x>) De notat că xor trebuie apelat ca o funcţie: xor(a,b). Operatorii logici and, or, not şi cei relaţionali pot fi apelaţi şi în formă funcţională: and(a,b),..., eq(a,b),... (vezi help ops). Precedenţa operatorilor este rezumată în tabela 1.8 (vezi help precedence). MATLAB evaluează operatorii de precedenţă egală de la stânga la dreapta. Precedenţa se poate modifica cu ajutorul parantezelor. De notat că versiunile MATLAB anterioare lui MATLAB 6 aveau aceeaşi precedenţă pentru and şi or (spre deosebire de majoritatea limbajelor de programare). MathWorks recomandă folosirea parantezelor pentru a garanta obţinerea rezultatelor identice în toate versiunile MATLAB. Pentru matrice all returnează un vector linie ce conţine rezultatul lui all aplicat fiecărei coloane. De aceea all(all(a=b)) este un alt mod de a testa egalitatea matricelor A şi B. Funcţia any lucrează analog; de exemplu, any(any(a==b)) re-

22 Introducere în MATLAB Nivel de precedenţă Operator 1 (cea mai mare) transpusa (. ), putere(.ˆ), transpusa conjugată complexă( ), putere matricială(ˆ) 2 plus unar (+), minus unar (-), negaţie ( ) 3 înmulţire (.*), împărţire dreaptă (./), împărţire stângă (.\), înmulţire matricială (*), împărţire dreaptă matricială (/), împărţire stângă matricială (\) 4 adunare (+), scădere (-) 5 două puncte (:) 6 mai mic (<), mai mic sau egal (<=), mai mare (>), mai mare sau egal (>=), egal (==), diferit (~=) 7 şi logic (&) 8 (cea mai mică) sau logic ( ) Tabela 1.8: Precedenţa operatorilor turnează 1 dacă A şi B au cel puţin un element egal şi în caz contrar. Comanda find returnează indicii corespunzători elementelor nenule ale unui vector. De exemplu, >> x = [-3 1 -inf ]; >> f = find(x) f = 1 2 4 Rezultatul lui find poate fi apoi utilizat pentru a selecta doar acele elemente ale vectorului: >> x(f) -3 1 -Inf Cu x ca în exemplul de mai sus, putem utiliza find pentru a obţine elementele finite ale lui x, >> x(find(isfinite(x))) -3 1 şi să înlocuim componentele negative ale lui x cu zero: >> x(find(x<))= x = 1

1.3. Matrice 23 Când find se aplică matricei A, vectorul de indici corespunde lui A privită ca un vector coloană obţinut din aşezarea coloanelor una peste alta (adică A(:)), şi acest vector poate fi utilizat pentru a indexa A. În exemplul următor se utilizează find pentru a face zero toate elementele lui A care sunt mai mici decât elementele corespunzătoare ale lui B: >> A = [4 2 16; 12 4 3], B = [12 3 1; 1-1 7] A = 4 2 16 12 4 3 B = 12 3 1 1-1 7 >> f = find(a<b) f = 1 3 6 >> A(f) = A = 16 12 4 În cazul matricelor, putem utiliza find sub forma [i,j] = find(a), care returnează vectorii i şi j ce conţin indicii de linie şi coloană ale elementelor nenule. Rezultatele operatorilor logici şi ale funcţiilor logice din MATLAB sunt tablouri de elemente şi 1, care sunt exemple de tablouri logice. Astfel de tablouri pot fi create şi prin aplicarea funcţiei logical unui tablou numeric. Tablourile logice pot fi utilizate la indexare. Fie exemplul >> clear >> y = [1 2-3 ] y = 1 2-3 >> i1 = logical(y) Warning: Values other than or 1 converted to logical 1(Type "warning off MATLAB:conversionToLogical" to suppress this warning.) >> i1 = 1 1 1 >> i2 = ( y = ) i2 = 1 1 1 >> i3 = [1 1 1 ] i3 = 1 1 1

24 Introducere în MATLAB >> whos Name Size Bytes Class i1 1x5 5 logical array i2 1x5 5 logical array i3 1x5 4 double array y 1x5 4 double array Grand total is 2 elements using 9 bytes >> y(i1) 1 2-3 >> y(i2) 1 2-3 >> isequal(i2,i3) 1 >> y(i3)??? Subscript indices must either be real positive integers or logicals. Acest exemplu ilustrează regula că A(M), unde M este un tablou logic de aceeaşi dimensiune ca şi A, extrage elementele lui A corespunzând elementelor lui M cu partea reală nenulă. Chiar dacă i2 are aceleaşi elemente ca i3 (şi la comparaţie ele ies egale), doar tabloul logic i2 poate fi utilizat la indexare. Un apel la find poate fi uneori evitat dacă argumentul său este un tablou logic. În exemplul precedent, x(find(isfinite(x))) poate fi înlocuit cu x(isfinite(x)). Se recomandă utilizarea lui find pentru claritate. 1.4. Programarea în MATLAB 1.4.1. Fluxul de control MATLAB are patru structuri de control: instrucţiunea if, instrucţiunea de ciclare for, instrucţiunea de ciclare while şi instrucţiunea switch. Cea mai simplă formă a instrucţiunii if este if expresie instrucţiuni end unde secvenţa instrucţiuni este executată dacă părţile reale ale elementelor lui expresie sunt toate nenule. Secvenţa de mai jos interschimbă x şi y dacă x este mai mare decât y: if x > y temp = y;

1.4. Programarea în MATLAB 25 y = x; x = temp; end Atunci când o instrucţiune if este urmată în aceeaşi linie de alte instrucţiuni, este nevoie de o virgulă pentru a separa if-ul de instrucţiunea următoare: if x >, x = sqrt(x); end Alternativa se implementează cu else, ca în exemplul a = piˆexp(1); c = exp(pi); if a >= c b = sqrt(aˆ2-cˆ2) else b = end În fine, se pot introduce teste suplimentare cu elseif (de notat că nu este nici un spaţiu între else şi if): >> if a >= c b = sqrt(aˆ2-cˆ2) elseif aˆc > cˆa b = cˆa/aˆc else b = aˆc/cˆa end Într-un test if de forma,,if condiţie1 & condiţie2, condiţie2 nu este evaluată dacă condiţie1 este falsă (aşa-numită evaluare prin scurtcircuit). Acest lucru este util când evaluarea lui condiţie2 ar putea da o eroare probabil din cauza unei variabile nedefinite sau a unei depăşiri de indice. Ciclul for este una dintre cele mai utile construcţii MATLAB, deşi codul este mai compact fără ea. Sintaxa ei este for variabilă = expresie instrucţiuni end De obicei, expresie este un vector de forma i:s:j. Instrucţiunile sunt executate pentru variabilă egală cu fiecare element al lui expresie în parte. De exemplu, suma primilor 25 de termeni ai seriei armonice 1/i se calculează prin >> s = ; >> for i = 1:25, s = s + 1/i; end, s s = 3.816

26 Introducere în MATLAB Un alt mod de a defini expresie este utilizarea notaţiei cu paranteze pătrate: for x = [pi/6 pi/4 pi/3], disp([x, sin(x)]), end.5236.5.7854.771 1.472.866 Ciclurile for pot fi imbricate, indentarea ajutând în acest caz la creşterea lizibilităţii. Editorul-debuger-ul MATLAB poate realiza indentarea automată. Codul următor construieşte o matrice simetrică 5 pe 5, A, cu elementul (i,j) egal cu i/j pentru j i: n = 5; A = eye(n); for j=2:n for i = 1:j-1 A(i,j)=i/j; A(j,i)=i/j; end end Expresia din ciclul for poate fi o matrice, în care caz lui variabilă i se atribuie succesiv coloanele lui expresie, de la prima la ultima. De exemplu, pentru a atribui lui x fiecare vector al bazei canonice, putem scrie for x=eye(n),..., end. Ciclul while are forma while expresie instrucţiuni end Secvenţa instrucţiuni se execută atât timp cât expresie este adevărată. Exemplul următor aproximează cel mai mic număr nenul în virgulă flotantă: x = 1; while x>, xmin = x; x = x/2; end, xmin xmin = 4.947e-324 Execuţia unui ciclu while sau for poate fi terminată cu o instrucţiune break, care dă controlul primei instrucţiuni de după end-ul corespunzător. Construcţia while 1,..., end, reprezintă un ciclu infinit, care este util atunci când nu este convenabil să se pună testul la începutul ciclului. (De notat că, spre deosebire de alte limbaje, MA- TLAB nu are un ciclu,,repeat-until.) Putem rescrie exemplul precedent mai concis prin x = 1; while 1 xmin = x; x = x/2;

1.4. Programarea în MATLAB 27 if x ==, break, end end xmin Într-un ciclu imbricat un break iese în ciclul de pe nivelul anterior. Instrucţiunea continue cauzează trecerea controlului la execuţia unui ciclu for sau while următoarei iteraţii, sărind instrucţiunile rămase din ciclu. Un exemplu trivial este: for i=1:1 if i < 5, continue, end disp(i) end care afişează întregii de la 5 la 1. Structura de control cu care încheiem este instrucţiunea switch. Ea constă din,,switch expresie urmată de o listă de instrucţiuni,,case expresie instrucţiuni, terminată opţional cu,,otherwise instrucţiuni şi urmată de end. Exemplul următor evaluează p-norma unui vector x pentru trei valori ale lui p: switch(p) case 1 y = sum(abs(x)); case 2 y = sqrt(x *x); case inf y = max(abs(x)); otherwise error( p poate fi 1, 2 sau inf. ) end Funcţia error generează un mesaj de eroare şi opreşte execuţia curentă. Expresia ce urmeză după case poate fi o listă de valori delimitate de acolade. Expresia din switch poate coincide cu orice valoare din listă: x = input( Enter a real number: ) switch x case {inf, -inf} disp( Plus or minus infinity ) case disp( Zero ) otherwise disp( Nonzero and finite ) end

28 Introducere în MATLAB Construcţia switch din MATLAB se comportă diferit de cea din C sau C++ : odată ce MATLAB a selectat un grup de expresii case şi instrucţiunile sale au fost executate, se dă controlul primei instrucţiuni de după switch, fără a fi nevoie de instrucţiuni break. 1.4.2. Fişiere M Fişierele M din MATLAB sunt echivalentele programelor, funcţiilor, subrutinelor şi procedurilor din alte limbaje de programare. Ele oferă următoarele avantaje: experimentarea algoritmului prin editare, în loc de a retipări o listă lungă de comenzi; înregistrarea permanentă a unui experiment; construirea de utilitare, care pot fi utilizate repetat; schimbul de fişiere M. Multe fişiere M scrise de entuziaşti pot fi obţinute de pe Internet, pornind de la pagina de web http://www.mathworks.com. Există şi grupul de ştiri comp.soft-sys.matlab, dedicat MATLAB. (Grupurile de ştiri pot fi citite în mai multe moduri, inclusiv printr-un web browser.) Se pot obţine detalii tastând info la prompterul MATLAB. Un fişier M este un fişier text cu extensia (tipul).m ce conţine comenzi MA- TLAB. Ele sunt de două tipuri: Fişiere M de tip script (sau fişiere de comenzi) nu au nici un argument de intrare sau ieşire şi operează asupra variabilelor din spaţiul de lucru. Fişiere M de tip funcţie conţin o linie de definiţie function şi pot accepta argumente de intrare şi returna argumente de ieşire, iar variabilele lor interne sunt locale funcţiei (înafară de cazul când sunt declarate global). Un fişier script permite memorarea unei secvenţe de comenzi care sunt utilizate repetat sau vor fi necesare ulterior. Script-ul de mai jos utilizează numerele aleatoare pentru a simula un joc. Să considerăm 13 cărţi de pică care sunt bine amestecate. Probabilitatea de a alege o carte particulară din pachet este 1/13. Acţiunea de extragere a unei cărţi se implementează prin generarea unui număr aleator. Jocul continuă prin punerea cărţii înapoi în pachet şi reamestecare până când utilizatorul apasă o tastă diferită de r sau s-a atins numărul de repetări (2). %JOCCARTI %Simularea unui joc de carti

1.4. Programarea în MATLAB 29 rand( state,sum(1*clock)); for k=1:2 n=ceil(13*rand); fprintf( Cartea extrasa: %3.f\n,n) disp( ) disp( Apasati r si Return pentru a continua ) r=input( sau orice litera pentru a termina:, s ); if r = r, break, end end Linia rand( state,sum(1*clock)); resetează de fiecare dată generatorul la o stare diferită. Primele două linii ale acestui fişier script încep cu simbolul % şi deci sunt linii de comentariu. Ori de câte ori MATLAB întâlneşte un % va ignora restul liniei. Aceasta ne permite să inserăm texte explicative care vor face fişierele M mai uşor de înţeles. Începând cu versiunea 7 se admit blocuri de comentarii, adică comentarii care să se întindă pe mai multe linii. Ele sunt delimitate prin operatorii %{ şi %}. Ei trebuie să fie singuri pe linie, ca în exemplul: %{ Comentariu bloc pe doua linii %} Dacă script-ul de mai sus este memorat în fişierul joccarti.m, tastând joccarti se obţine: >> joccarti Cartea extrasa: 7 Apasati r si Return pentru a continua sau orice litera pentru a termina: r Cartea extrasa: 3 Apasati r si Return pentru a continua sau orice litera pentru a termina: a >> Fişierele M de tip funcţie permit extinderea limbajului MATLAB prin scrierea de funcţii proprii care acceptă şi returnează argumente. Ele se pot utiliza în acelaşi mod ca funcţiile MATLAB existente, cum ar fi sin, eye, size, etc. Sursa MATLAB 1.1 dă o funcţie simplă care calculează media şi abaterea medie pătratică a unei selecţii (vector). Acest exemplu ilustrează unele facilităţi ale

3 Introducere în MATLAB Sursa MATLAB 1.1 Funcţia stat function [med,abmp] = stat(x) %STAT Media si abaterea medie patratica a unei selectii % [MED,ABMP] = STAT(X) calculeaza media si abaterea % medie patratica a selectiei X n = length(x); med = sum(x)/n; abmp = sqrt(sum((x-med).ˆ2)/n); funcţiilor. Prima linie începe cu cuvântul cheie function urmat de argumentele de ieşire, [med,abmp] şi de simbolul =. În dreapta = urmează numele funcţiei, stat, urmat de argumentele de intrare, în cazul nostru x, între paranteze. (În general, putem avea orice număr de argumente de intrare şi de ieşire.) Numele de funcţie trebuie să fie la fel ca al fişierului.m în care funcţia este memorată în cazul nostru stat.m. A doua linie a unui fişier funcţie se numeşte linie H1 sau help 1. Se recomandă ca ea să aibă următoarea formă: să înceapă cu un %, urmat fără nici un spaţiu de numele funcţiei cu litere mari, urmat de unul sau mai multe spaţii şi apoi o scurtă descriere. Descrierea va începe cu o literă mare, se va termina cu un punct, iar dacă este în engleză se vor omite cuvintele the şi a. Când se tastează help nume functie, toate liniile, de la prima linie de comentariu pâna la prima linie care nu este de comentariu (de obicei o linie goală, pentru lizibilitatea codului sursă) sunt afişate pe ecran. Deci, aceste linii descriu funcţia şi argumentele sale. Se convine ca numele de funcţie şi de argumente să se scrie cu litere mari. Pentru exemplul stat.m avem >>help stat STAT media si abaterea medie patratica a unei selectii [MED,ABMP] = STAT(X) calculeaza media si abaterea medie patratica a selectiei X Se recomandă documentarea tuturor funcţiilor utilizator în acest mod, oricât de scurte ar fi. Este util ca în liniile de comentariu din text sa apară data scrierii funcţiei şi datele când s-au făcut modificări. Comanda help lucrează similar şi pe fişiere script. Funcţia stat se apelează la fel ca orice funcţie MATLAB: >> [m,a]=stat(1:1) m = 5.5 a = 2.8723 >> x=rand(1,1); [m,a]=stat(x)

1.4. Programarea în MATLAB 31 m = a =.525.1466 O funcţie mai complicată este sqrtn, ilustrată în sursa 1.2. Dându-se a >, ea calculează a cu metoda lui Newton, x k+1 = 1 ) (x k + axk, x 1 = a, 2 afişând şi iteraţiile. Dăm exemple de utilizare: >> [x,it]=sqrtn(2) k x_k er. relativa 1: 1.5e+ 3.33e-1 2: 1.4166666666666665e+ 5.88e-2 3: 1.414215686274597e+ 1.73e-3 4: 1.4142135623746899e+ 1.5e-6 5: 1.414213562373949e+ 1.13e-12 6: 1.414213562373949e+.e+ x = 1.4142 it = 6 >> x=sqrtn(2,1e-4) k x_k er. relativa 1: 1.5e+ 3.33e-1 2: 1.4166666666666665e+ 5.88e-2 3: 1.414215686274597e+ 1.73e-3 4: 1.4142135623746899e+ 1.5e-6 x = 1.4142 Acest fişier M utilizează comanda return, care dă controlul apelantului. Spre deosebire de alte limbaje de programare, nu este necesar să se pună return la sfârşitul unei funcţii sau al unui script. Funcţia nargin returnează numărul de argumente de intrare cu care funcţia a fost apelată şi permite atribuirea de valori implicite argumentelor nespecificate. Dacă apelul lui sqrtn nu a furnizat o valoare pentru tol, atunci tol primeşte valoarea eps. Numărul de argumente la ieşire este returnat de funcţia nargout. Un fişier M de tip funcţie poate conţine alte funcţii, numite subfuncţii, care pot să apară în orice ordine după funcţia principală (sau primară). Subfuncţiile sunt vizibile numai din funcţia principală sau din alte subfuncţii. Ele realizează calcule care

32 Introducere în MATLAB Sursa MATLAB 1.2 Funcţia sqrtn function [x,iter] = sqrtn(a,tol) %SQRTN Radical cu metoda lui Newton. % X = SQRTN(A,TOL) calculeaza radacina patrata a lui % A prin metoda lui Newton(sau a lui Heron). % presupunem ca A >=. % TOL este toleranta (implicit EPS). % [X,ITER] = SQRTN(A,TOL) returneaza numarul de % iteratii ITER necesare. if nargin < 2, tol = eps; end x = a; iter = ; xdiff = inf; fprintf( k x_k er. relativa\n ) for k=1:5 iter = iter + 1; xold = x; x = (x + a/x)/2; xdiff = abs(x-xold)/abs(x); fprintf( %2.f: %2.16e %9.2e\, iter, x, xdiff) if xdiff <= tol, return, end end error( Nu s-a atins precizia dupa 5 de iteratii. ) trebuie separate de funcţia principală, dar nu sunt necesare în alte fişiere M, sau supraîncarcă funcţii cu acelaşi nume (subfuncţiile au prioritate mai mare). Help-ul pentru o subfuncţie se poate specifica punând numele funcţiei urmat de / şi numele subfuncţiei. Pentru a crea şi edita fişiere M avem două posibilităţi. Putem utiliza orice editor pentru fişiere ASCII sau putem utiliza MATLAB Editor/Debugger. Sub Windows el se apelează prin comanda edit sau din opţiunile de meniu File-New sau File-Open. Sub Unix se apelează doar prin comanda edit. Editorul/debugger-ul MATLAB are diverse faciltăţi care ajută utilizatorul, cum ar fi indentarea automată a ciclurilor şi structurilor de control, evidenţierea sintaxei prin culori, verificarea perechilor de paranteze şi apostrofuri. Cele mai multe funcţii MATLAB sunt fişiere M păstrate pe disc, dar există şi funcţii predefinite conţinute în interpretorul MATLAB. Calea MATLAB (MATLAB

1.4. Programarea în MATLAB 33 path) este o listă de directori care specifică unde caută MATLAB fişierele M. Un fişier M este disponibil numai dacă este pe calea MATLAB. Drumul poate fi setat şi modificat prin comenzile path şi addpath, sau prin utilitarul (fereastra) path Browser, care se apelează din opţiunea de meniu File-Set Path sau tastând pathtool. Un script (dar nu şi o funcţie) care nu este pe calea de căutare se poate executa cu run urmat de calea completă până la fişierul M. Un fişier M se poate afişa pe ecran cu comanda type. Un aspect important al MATLAB este dualitatea comenzi-funcţii. Înafară de forma clasică, nume, urmat de argumente între paranteze, funcţiile pot fi apelate şi sub forma nume, urmat de argumente separate prin spaţii. MATLAB presupune în al doilea caz că argumentele sunt şiruri de caractere. De exemplu apelurile format long şi format( long ) sunt echivalente. MATLAB 7 permite definirea de funcţii imbricate, adică funcţii conţinute în corpul altor funcţii. În exemplul care urmează, funcţia F2 este imbricată în funcţia F1: function x = F1(p1,p2)... F2(p2) function y = F2(p3)... end... end Ca orice altă funcţie, o funcţie imbricată are propriul său spaţiu de lucru în care se memorează variabilele pe care le utilizează. Ea are de asemenea acces la spaţiul de lucru al tuturor funcţiilor în care este imbricată. Astfel, de exemplu, o variabilă care are o valoare atribuită ei de funcţia exterioară poate fi citită şi modificată de o funcţie imbricată la orice nivel în funcţia exterioară. Variabilele create într-o funcţie imbricată pot fi citite sau modificate în orice funcţie care conţine funcţia imbricată. 1.4.3. Argumente funcţie În multe probleme, cum ar fi integrarea numerică, rezolvarea unor ecuaţii operatoriale, minimizarea unei funcţii, este nevoie ca o funcţie să fie transmisă ca argument unei alte funcţii. Aceasta se poate realiza în mai multe feluri, depinzând de modul în care funcţia apelată a fost scrisă. Vom ilustra aceasta cu funcţia ezplot, care reprezintă grafic funcţia f(x) peste domeniul implicit [ 2π, 2π]. Un prim mod este transmiterea funcţiei printr-o construcţie numită function handle. Acesta este un tip de date MATLAB care conţine toate informaţiile necesare pentru a evalua o funcţie. Un function handle poate fi creat punând caracterul @ în faţa numelui de funcţie.

34 Introducere în MATLAB Astfel, dacă fun este un fişier M de tip funcţie de forma cerută de ezplot, atunci putem tasta ezplot(@fun) fun poate fi numele unei funcţii predefinite: ezplot(@sin) Numele unei funcţii poate fi transmis ca un şir de caractere: ezplot( exp ) Function handle a fost introdus începând cu MATLAB 6 şi este de preferat utilizării şirurilor, fiind mai eficient şi mai versatil. Totuşi, ocazional se pot întâlni funcţii care să accepte argumente de tip funcţie sub formă de şir, dar nu sub formă de function handle. Conversia dintr-o formă în alta se poate face cu func2str şi str2func (vezi help function handle). Mai există două moduri de a transmite o funcţie lui ezplot: ca expresie între apostrofuri, ezplot( xˆ2-1 ), ezplot( 1/(1+xˆ2) ) sau ca obiect inline ezplot(inline( exp(x)-1 )) Un obiect inline este o funcţie definită printr-un şir şi care poate fi atribuită unei variabile şi apoi evaluată: >> f=inline( exp(x)-1 ), f(2) f = Inline function: f(x) = exp(x)-1 6.3891 MATLAB determină şi ordonează argumentele unei funcţii inline. Dacă acest lucru nu este satisfăcător, argumentele se pot defini şi ordona explicit, transmiţând lui inline parametrii suplimentari: >> f = inline( log(a*x)/(1+yˆ2) ) f = Inline function: f(a,x,y) = log(a*x)/(1+yˆ2) >> f = inline( log(a*x)/(1+yˆ2), x, y, a ) f = Inline function: f(x,y,a) = log(a*x)/(1+yˆ2) Începând cu versiunea 7, MATLAB permite funcţii anonime. Ele pot fi definite în linii de comandă, fişiere M de tip funcţie sau script şi nu necesită un fişier M. Sintaxa pentru crearea unei funcţii anonime este f = @(listaarg)expresie